package cl.kaisanetwork.kaisaportal.service;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import cl.kaisanetwork.kaisaportal.domain.dao.impl.UsuarioDaoImpl;
import cl.kaisanetwork.kaisaportal.domain.entities.Usuario;

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import com.google.appengine.repackaged.org.apache.commons.logging.Log;
import com.google.appengine.repackaged.org.apache.commons.logging.LogFactory;

@Service
public class UsuarioService {

	protected final Log logger = LogFactory.getLog(UsuarioService.class);

	@Resource
	private UsuarioDaoImpl usuarioDaoImpl;

	public void setUsuarioDao(UsuarioDaoImpl usuarioDaoImpl) {
		this.usuarioDaoImpl = usuarioDaoImpl;
	}

	public void createUsuario(Usuario user) {
		logger.info("Se inicio creacion de un nuevo usuario");
		logger.debug("Usuario a crear: " + user.toString());
		usuarioDaoImpl.saveObject(user);
	}

	public List<Usuario> getUsuarios() {
		return usuarioDaoImpl
				.findByQuery("SELECT u FROM cl.kaisanetwork.kaisaportal.domain.entities.Usuario u");
	}
	
	public List<Usuario> getUsuariosSoftBy(String field, boolean asc) {
		if(field == null)
			field = "created_at";
		if (asc)
			return usuarioDaoImpl
					.findByQuery(
							"SELECT u FROM cl.kaisanetwork.kaisaportal.domain.entities.Usuario u ORDER BY u." + field + " ASC");
		else
			return usuarioDaoImpl
					.findByQuery(
							"SELECT u FROM cl.kaisanetwork.kaisaportal.domain.entities.Usuario u ORDER BY u." + field + " DESC");
	}

	public Usuario findUsuarioByGoogleId(String id) {
		List<Usuario> users = usuarioDaoImpl.findByQuery(
				"SELECT u FROM Usuario u WHERE u.google_id = ?1", id);
		if (users != null) {
			try {
				return users.get(0);
			} catch (Exception e) {
				logger.error("Error al retornar un objeto", e);
				return null;
			}
		} else
			return null;
	}
	
	public void makeLogin(Long id, Date currentLogin, String currentIp) {
		logger.info("Se inicio session de usuario");
		Usuario currentUser = usuarioDaoImpl.getUser(id);
		logger.debug(currentUser.toString() + " ha iniciado session");
		currentUser.setLast_login_at(currentUser.getCurrent_login_at());
		currentUser.setLast_login_ip(currentUser.getCurrent_login_ip());
		currentUser.setLast_request_at(currentLogin);
		currentUser.setCurrent_login_at(currentLogin);
		currentUser.setCurrent_login_ip(currentIp);
		currentUser.setLogin_count(currentUser.getLogin_count() + 1);
		logger.trace("Datos de la session creada para usuario" + currentUser.toString() + "Trace" + currentUser);
		usuarioDaoImpl.saveObject(currentUser);
	}
	
	public void makeRequest(Long id, Date request) {
		Usuario currentUser = usuarioDaoImpl.getUser(id);
		currentUser.setLast_request_at(request);
		usuarioDaoImpl.saveObject(currentUser);
	}

	public UserService getUserService() {
		return UserServiceFactory.getUserService();
	}

}
